package org.longteng.security.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;

import java.util.Calendar;
import java.util.Date;

/**
 * 简单token处理类
 */
@Slf4j
public class JWTSecretUtil {

    /**
     * 生成 Token，简单HMAC256方式，非密钥对方式，
     * @param uid   用户id
     * @param userName 用户名称
     * @param signSecret  签名密钥
     * @return  返回token，可放cookie供验证
     */
    public static String createToken(String uid, String userName, String signSecret){
        // 使用 JDK 自带的 java.util.Calendar 日历工具类
        // 获取当前时间
        Date date = new Date();
        log.debug("[{}]Creating Token: ", date);
        Calendar calendar = Calendar.getInstance();
        // 设置有效时间为 30 分钟
        calendar.add(Calendar.MINUTE, 30);
        // 创建构造器
        JWTCreator.Builder builder = JWT.create();
        // 设置 claim
        return builder.withClaim("uid", uid)
                .withClaim("username", userName)
                .withIssuedAt(date) 						// 发行时间
                .withExpiresAt(calendar.getTime()) 			// 过期时间
                .sign(Algorithm.HMAC256(signSecret));     // 签名
    }
    // 解析 Token

    /**
     * 解析 Token，简单HMAC256方式，非密钥对方式，
     * @param token 要验证的token
     * @param signSecret  签名密钥
     * @return
     */
    public static DecodedJWT verifyToken(String token, String signSecret){
        // 验证 Token
        DecodedJWT decodedJWT = null;
        try {
            // 采取统一的解码方式
            decodedJWT = JWT.require(Algorithm.HMAC256(signSecret))
                    .build()
                    .verify(token);
        } catch (TokenExpiredException e){
            if(log.isDebugEnabled()) {
                log.debug("身份认证已过期的token:{}", token);
            }
            log.error("身份认证已过期,请重新登录.",e);
        }

        return decodedJWT;
    }

}
